package com.itheima.finaldemo; // 包声明：表示这个类属于com.itheima.finaldemo包，用于组织代码结构

public class FinalDemo1 { // 公共类定义：创建名为FinalDemo1的公开类，用于演示final关键字的作用
    // final修饰静态成员变量
    // final修饰静态变量，这个变量今后被称为常量，可以记住一个固定值，并且程序中不能修改了，通常这个值作为系统的配置信息。
    // 常量的名称，建议全部大写，多个单词用下划线链接
    public static final String SCHOOL_NAME = "黑马程序员"; // 常量声明：定义一个公共的、静态的、不可修改的字符串常量

    // final修饰实例变量（一般没有意义）
    private final String name = "猪刚鬣"; // final实例变量：定义一个私有的、不可修改的实例变量，初始化时必须赋值

    public static void main(String[] args) { // 主方法：Java程序的入口点，程序从这里开始执行
        // 目标：认识final关键字的作用。
        // 3、final修饰变量：变量有且仅能被赋值一次。
        /*
           变量有哪些呢?
            a、成员变量:
                 静态成员变量
                 实例成员变量
            b、局部变量
         */
        final double rate = 3.14; // final局部变量：定义一个不可修改的局部变量，赋值后不能再改变
        // rate = 3.16; // 第二次赋值，报错。这行代码被注释，因为final变量不能二次赋值

        buy(0.8); // 方法调用：调用buy方法，传入0.8作为参数

        FinalDemo1 f = new FinalDemo1(); // 创建对象：实例化FinalDemo1类的对象
        System.out.println(f.name); // 输出：打印对象的name属性值
        // f.name = "高翠兰"; // 第二次赋值，报错。这行代码被注释，因为final实例变量不能二次赋值

        final int a = 20; // final局部变量：定义一个不可修改的整数变量
        // a = 30; // 第二次赋值，报错。这行代码被注释，因为final变量不能二次赋值

        final int[] arr = {11, 22, 33, 44}; // final引用变量：定义一个不可修改引用地址的数组变量
        // arr = new int[]{33, 55, 44}; // 第二次赋值，报错。这行代码被注释，因为final引用不能指向新对象
        arr[2] = 90; // 允许修改：final引用指向的对象内容是可以修改的，这里修改数组的第三个元素
    } // main方法结束标记

    public static void buy(final double z){ // 方法定义：创建buy静态方法，参数z被final修饰
        // z = 0.1;  // 第二次赋值，报错。这行代码被注释，因为final参数不能在方法内修改
        System.out.println(z); // 输出：打印参数z的值
    } // buy方法结束标记
} // FinalDemo1类结束标记

// 1、final修饰类，类不能被继承。
final class A{ // final类定义：创建名为A的final类，该类不能被任何其他类继承
}
// class B extends A{} // 这行代码被注释，因为A是final类，不能被继承

// 2、final修饰方法，方法不能被重写。
class C{ // 类定义：创建名为C的普通类
    public final void show(){ // final方法定义：创建名为show的final方法，该方法不能被子类重写
        System.out.println("show方法被执行"); // 输出：打印字符串
    } // show方法结束标记
}
class D extends C{ // 类定义：创建名为D的类，继承自C类
//     @Override
//     public void show(){ // 这几行代码被注释，因为父类C的show方法是final的，不能被重写
//         System.out.println("show方法被执行");
//     }
} // D类结束标记
